class EventEmitter{
    constructor(){
         this.eventList={
         }
    }
  on(eventName,cb){
     if(!this.eventList[eventName]){
        this.eventList[eventName]=[]
     }
     this.eventList[eventName].push(cb)
  }
  emit(eventName){
    if(this.eventList[eventName]){
        const handeler=this.eventList[eventName].slice()
        handeler.forEach((item)=>{
            item()
        })
    }
  }
  off(eventName,cb){
    const callback=this.eventList[eventName]
    const index=callback.indexOf(cb)
    if(index!==-1)
    {
        callback.splice(index,1)
    }  
  }
   once(eventName,cb){
     const warp=()=>{
        cb()
        this.off(eventName,warp)
     }
    this.on(eventName,warp)
   }
}
// 创建事件发射器实例
const _event = new EventEmitter();

// 定义事件处理函数
function kang() {
    console.log('杨总买房子');
}
function ji() {
    console.log('刘总也买房子');
}
function cheng() {
    console.log('成哥买车位');
}
// 测试常规事件监听
_event.on('hasHouse', kang);
_event.on('hasHouse', ji);
// 测试一次性事件监听
_event.once('hasCar', cheng);
// 触发事件测试
console.log('--- 第一次触发 hasCar 事件 ---');
_event.emit('hasCar');  // 应该执行 cheng 函数

console.log('\n--- 第二次触发 hasCar 事件 ---');
_event.emit('hasCar');  // 不应该再执行，因为是一次性监听

console.log('\n--- 触发 hasHouse 事件 ---');
_event.emit('hasHouse');  // 应该执行 kang 和 ji 函数

// 测试取消监听
console.log('\n--- 取消 kang 的 hasHouse 监听后 ---');
_event.off('hasHouse', kang);
_event.emit('hasHouse');  // 现在应该只执行 ji 函数
